package strategy;

import strategy.impl.AlipayStrategy;
import strategy.impl.CreditCardStrategy;
import strategy.impl.WeChatPayStrategy;

import java.util.List;

/**
 * 策略模式主程序
 * 策略模式（Strategy）定义一系列的算法，把它们一个个封装起来，并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
 * 策略模式的核心意图是：让算法的变化独立于使用算法的客户。
 * 策略模式通过定义一组算法，并把其封装到一个对象中。然后在运行时，可以灵活的使用其中的一个算法。
 * <p>
 * 假设您要开发一个电商网站的支付系统。用户可以选择多种支付方式：支付宝、微信支付、信用卡支付。每种支付方式的实现细节都不同。
 * 传统方案：您可能会在支付方法中写一个巨大的 `if/else` 或 `switch` 语句，根据传入的支付类型来执行相应的逻辑。
 * 这种代码难以维护和扩展，如果新增一种支付方式，您必须修改这个核心方法。
 * 策略模式方案：您可以为每种支付方式创建一个独立的策略类（如 {@link strategy.impl.AlipayStrategy} 和
 * {@link strategy.impl.WeChatPayStrategy}）, 它们都实现一个共同的支付策略接口。
 * 在客户端，您只需要根据用户的选择，将相应的策略对象设置给上下文对象，然后执行支付操作。
 * <p>
 * 此外，策略模式在Java中最典型的应用场景是 {@link java.util.Comparator} 和 {@link java.util.Collections#sort(List)}。
 * 具体使用详见{@link strategy.collectionsort.SimpleClient}
 *
 * @author Liu Yicong
 * @date 2025/9/23
 */
public class StrategyClient {
	public static void main(String[] args) {
		PaymentContext context = new PaymentContext();

		// 用户选择支付宝支付
		System.out.println("用户选择支付宝支付...");
		context.setPaymentStrategy(new AlipayStrategy());
		context.executePayment(100.0);

		System.out.println("\n-----------------------------");

		// 用户选择微信支付
		System.out.println("用户选择微信支付...");
		context.setPaymentStrategy(new WeChatPayStrategy());
		context.executePayment(50.0);

		System.out.println("\n-----------------------------");

		// 用户选择信用卡支付
		System.out.println("用户选择信用卡支付...");
		context.setPaymentStrategy(new CreditCardStrategy());
		context.executePayment(8000.0);

	}
}
